package com.moonLight.weblog.common.domain.mapper;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.moonLight.weblog.common.domain.dos.CommentDO;

import java.time.LocalDate;
import java.util.List;
import java.util.Objects;

public interface CommentMapper extends BaseMapper<CommentDO> {
    /**
     * 根据路由地址、状态查询对应的评论
     * @param routerUrl
     * @return
     */
    default List<CommentDO> selectByRouterUrlAndStatus(String routerUrl, Integer status) {
        return selectList(Wrappers.<CommentDO>lambdaQuery()
                .eq(CommentDO::getRouterUrl, routerUrl) // 按路由地址查询
                .eq(CommentDO::getStatus, status) // 按状态查询
                .orderByDesc(CommentDO::getCreateTime) // 按创建时间倒序
        );
    }

    /**
     * 分页查询评论
     * @param current 当前页码
     * @param size 每页显示数量
     * @param routerUrl 路由地址(在那个文章下面发布的评论)
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param status 评论的状态
     * @return
     */
    default Page<CommentDO> selectPageList(Long current, Long size, String routerUrl, LocalDate startDate, LocalDate endDate, Integer status) {

        //  设置分页对象
        Page<CommentDO> page = new Page<>(current, size);
        //  构建查询条件
        LambdaQueryWrapper<CommentDO> wrapper = new LambdaQueryWrapper<>();
        wrapper
                .eq(StringUtils.isNotBlank(routerUrl), CommentDO::getRouterUrl, routerUrl) // like 模块查询
                .ge(Objects.nonNull(startDate), CommentDO::getCreateTime, startDate) // 大于等于 startDate
                .le(Objects.nonNull(endDate), CommentDO::getCreateTime, endDate)  // 小于等于 endDate
                .eq(Objects.nonNull(status), CommentDO::getStatus, status)  // 评论状态 status
               .orderByDesc(CommentDO::getCreateTime);
        return selectPage(page, wrapper);
    }


    /**
     *
     * 删除评论 会涉及到二级评论的评论的删除
     * 删除之前需要确认是否存在
     *  1. 一级评论的删除
     *  2. 二级评论的查找
     *
     */
    /**
     * 根据回复的评论ID 查找所有评论
     * @param replyCommentId
     * @return
     */
    default List<CommentDO> selectAllByReplyCommentIdCommentDos(Long replyCommentId) {
        return selectList(Wrappers.<CommentDO>lambdaQuery()
                .eq(CommentDO::getReplyCommentId, replyCommentId)
                .orderByDesc(CommentDO::getCreateTime)
        );
    }

    /**
     * 根据评论的父评论ID 删除评论
     * @param parentCommentId
     * @return
     */
    default int deleteByParentCommentId(Long parentCommentId){
        return delete(Wrappers.<CommentDO>lambdaQuery()
                .eq(CommentDO::getParentCommentId, parentCommentId));
    }
}
